home *** CD-ROM | disk | FTP | other *** search
/ CD ROM Paradise Collection 4 / CD ROM Paradise Collection 4 1995 Nov.iso / program / swagg_m.zip / GRAPHICS.SWG / 0057_Palette Maniputlation.pas < prev    next >
Pascal/Delphi Source File  |  1994-01-27  |  6KB  |  213 lines

  1. {$G+}  { Enable 286 Instructions }
  2. Unit Palette;
  3.  
  4. { Programmed By David Dahl }
  5.  
  6. (* PUBLIC DOMAIN *)
  7.  
  8. Interface
  9.  
  10.   Type PaletteRec  = Record
  11.                            Red,
  12.                            Green,
  13.                            Blue  : Byte;
  14.                      End;
  15.        PaletteType = Array[0..255] of PaletteRec;
  16.        PalettePtr  = ^PaletteType;
  17.  
  18.   Procedure SetPalette        (Var PalBuf : PaletteType);
  19.   Procedure GetPalette        (Var PalBuf : PaletteType);
  20.  
  21.   Procedure BlackPalette;
  22.   Procedure FadeInFromBlack   (Var Palin : PaletteType);
  23.   Procedure FadeInFromBlackQ  (Var Palin     : PaletteType;
  24.                                    Intensity : Word);
  25.   Procedure FadeOutToBlack    (Var Palin : PaletteType);
  26.   Procedure FadeFromPalToPal  (Var OldPal, NewPal : PaletteType);
  27.   Procedure FadeFromPalToPalQ (Var OldPal, NewPal : PaletteType;
  28.                                    Color          : Word);
  29.  
  30.  
  31.   Var BlackP  : PaletteType;
  32.       WhiteP  : PaletteType;
  33.  
  34.       TempPal : PaletteType;
  35.  
  36. Implementation
  37.  
  38. {-[ Set Value Of All DAC Registers ]--------------------------------------}
  39. Procedure SetPalette (Var PalBuf : PaletteType); Assembler;
  40. Asm
  41.     PUSH DS
  42.  
  43.     XOR AX, AX       { Palette Start = 0 }
  44.     MOV CX, 0300h / 2
  45.     LDS SI, PalBuf   { Load DS:SI With Address Of PalBuf (For OUTSB) }
  46.  
  47.     MOV DX, 03C8h    { Tell VGA Card What DAC Color To Start With }
  48.     OUT DX, AL
  49.  
  50.     INC DX           { Set DX To Equal DAC Data Port }
  51.     MOV BX, DX
  52.     CLD
  53.  
  54.     { Wait For V-sync }
  55.     MOV DX, 03DAh
  56.     @VSYNC0:
  57.       IN   AL, DX
  58.       TEST AL, 8
  59.     JZ @VSYNC0
  60.  
  61.     MOV DX, BX
  62.     REP
  63.        OUTSB
  64.  
  65.     MOV BX, DX
  66.  
  67.     { Wait For V-sync }
  68.     MOV DX, 03DAh
  69.     @VSYNC1:
  70.       IN   AL, DX
  71.       TEST AL, 8
  72.     JZ @VSYNC1
  73.  
  74.     MOV DX, BX
  75.     MOV CX, 0300h / 2
  76.     REP
  77.        OUTSB
  78.  
  79.     POP DS
  80. End;
  81.  
  82. {-[ Get Value Of All DAC Registers ]--------------------------------------}
  83. Procedure GetPalette (Var PalBuf : PaletteType); Assembler;
  84. Asm
  85.     PUSH DS
  86.  
  87.     XOR AX, AX       { Palette Start = 0 }
  88.     MOV CX, 0300h
  89.     LES DI, PalBuf   { Load ES:DI With Address Of PalBuf (For INSB) }
  90.  
  91.     MOV DX, 03C7h    { Tell VGA Card What DAC Color To Start With }
  92.     OUT DX, AL
  93.  
  94.     INC DX           { Set DX To Equal DAC Data Port }
  95.     INC DX
  96.     CLD
  97.  
  98.     REP
  99.        INSB
  100.  
  101.     POP DS
  102. End;
  103.  
  104.  
  105. Procedure BlackPalette;
  106. Begin
  107.      SetPalette (BlackP);
  108. End;
  109.  
  110. Procedure FadeInFromBlack (Var Palin : PaletteType);
  111. Var DAC,
  112.     Intensity : Word;
  113. Begin
  114.      For Intensity := 0 to 32 do
  115.      Begin
  116.        For DAC := 0 to 255 do
  117.        Begin
  118.           TempPal[DAC].Red   := (Palin[DAC].Red   * Intensity) DIV 32;
  119.           TempPal[DAC].Green := (Palin[DAC].Green * Intensity) DIV 32;
  120.           TempPal[DAC].Blue  := (Palin[DAC].Blue  * Intensity) DIV 32;
  121.        End;
  122.  
  123.        SetPalette (TempPal);
  124.      End;
  125. End;
  126.  
  127. Procedure FadeInFromBlackQ (Var Palin     : PaletteType;
  128.                                 Intensity : Word);
  129. Const DAC : Word = 0;
  130. Begin
  131.      For DAC := 0 to 255 do
  132.      Begin
  133.           TempPal[DAC].Red   := (Palin[DAC].Red   * Intensity) DIV 32;
  134.           TempPal[DAC].Green := (Palin[DAC].Green * Intensity) DIV 32;
  135.           TempPal[DAC].Blue  := (Palin[DAC].Blue  * Intensity) DIV 32;
  136.      End;
  137.  
  138.      SetPalette (TempPal);
  139. End;
  140.  
  141. Procedure FadeOutToBlack (Var Palin : PaletteType);
  142. Var DAC,
  143.     Intensity : Word;
  144. Begin
  145.      For Intensity := 32 downto 0 do
  146.      Begin
  147.        For DAC := 0 to 255 do
  148.        Begin
  149.           TempPal[DAC].Red   := (Palin[DAC].Red   * Intensity) DIV 32;
  150.           TempPal[DAC].Green := (Palin[DAC].Green * Intensity) DIV 32;
  151.           TempPal[DAC].Blue  := (Palin[DAC].Blue  * Intensity) DIV 32;
  152.        End;
  153.  
  154.        SetPalette (TempPal);
  155.      End;
  156. End;
  157.  
  158.  
  159. Procedure FadeFromPalToPal (Var OldPal, NewPal : PaletteType);
  160. Var DAC,
  161.     Color : Word;
  162. Begin
  163.      For Color := 32 downto 0 do
  164.      Begin
  165.        For DAC := 0 to 255 do
  166.        Begin
  167.           TempPal[DAC].Red   := ((OldPal[DAC].Red   * Color) DIV 32) +
  168.                                 ((NewPal[DAC].Red   * (32 - Color)) DIV 32);
  169.           TempPal[DAC].Green := ((OldPal[DAC].Green * Color) DIV 32) +
  170.                                 ((NewPal[DAC].Green * (32 - Color)) DIV 32);
  171.           TempPal[DAC].Blue  := ((OldPal[DAC].Blue  * Color) DIV 32) +
  172.                                 ((NewPal[DAC].Blue  * (32 - Color)) DIV 32);
  173.        End;
  174.  
  175.        SetPalette (TempPal);
  176.      End;
  177. End;
  178.  
  179. Procedure FadeFromPalToPalQ (Var OldPal, NewPal : PaletteType;
  180.                                  Color          : Word);
  181. Const DAC : Word = 0;
  182. Begin
  183.      For DAC := 0 to 255 do
  184.      Begin
  185.           TempPal[DAC].Red   := ((OldPal[DAC].Red   * (32 - Color)) DIV 32)+
  186.                                 ((NewPal[DAC].Red   * Color) DIV 32);
  187.           TempPal[DAC].Green := ((OldPal[DAC].Green * (32 - Color)) DIV 32)+
  188.                                 ((NewPal[DAC].Green * Color) DIV 32);
  189.           TempPal[DAC].Blue  := ((OldPal[DAC].Blue  * (32 - Color)) DIV 32)+
  190.                                 ((NewPal[DAC].Blue  * Color) DIV 32);
  191.      End;
  192.  
  193.      SetPalette (TempPal);
  194. End;
  195.  
  196. Var Counter : Word;
  197. Begin
  198.      For Counter := 0 to 255 do
  199.      Begin
  200.           BlackP[Counter].Red   := 0;
  201.           BlackP[Counter].Green := 0;
  202.           BlackP[Counter].Blue  := 0;
  203.      End;
  204.  
  205.      For Counter := 0 to 255 do
  206.      Begin
  207.           WhiteP[Counter].Red   := 63;
  208.           WhiteP[Counter].Green := 63;
  209.           WhiteP[Counter].Blue  := 63;
  210.      End;
  211. End.
  212.  
  213.